/**
 * 动态表格系统类型定义
 */

// 字段类型
export const FieldType = {
  TEXT: 'text',
  NUMBER: 'number',
  SELECT: 'select',
  DATE: 'date',
  DATETIME: 'datetime',
  SWITCH: 'switch',
  RADIO: 'radio',
  CHECKBOX: 'checkbox',
  TEXTAREA: 'textarea',
  IMAGE: 'image',
  FILE: 'file',
} as const;

export type FieldType = typeof FieldType[keyof typeof FieldType];

// 字段对齐方式
export const FieldAlign = {
  LEFT: 'left',
  CENTER: 'center',
  RIGHT: 'right',
} as const;

export type FieldAlign = typeof FieldAlign[keyof typeof FieldAlign];

// 表单字段校验规则
export interface ValidationRule {
  required?: boolean;
  min?: number;
  max?: number;
  minLength?: number;
  maxLength?: number;
  pattern?: RegExp;
  message?: string;
  validator?: (value: any) => boolean | Promise<boolean>;
}

// 选项配置（用于下拉框、单选、复选等）
export interface FieldOption {
  label: string;
  value: string | number | boolean;
  disabled?: boolean;
  children?: FieldOption[];
}

// 选项来源类型
export type OptionsSource = 'static' | 'dictionary' | 'api';

// 选项配置
export interface OptionsConfig {
  // 选项来源：static（静态）、dictionary（字典）、api（API接口）
  source?: OptionsSource;
  
  // 静态选项（当 source 为 'static' 或未指定时使用）
  options?: FieldOption[];
  
  // 字典配置（当 source 为 'dictionary' 时使用）
  dictionaryCode?: string; // 字典类型编码
  
  // API配置（当 source 为 'api' 时使用）
  apiUrl?: string; // API 地址
  apiMethod?: 'get' | 'post'; // 请求方法
  apiParams?: Record<string, any>; // 请求参数
  apiTransform?: (data: any) => FieldOption[]; // 数据转换函数
  labelField?: string; // 标签字段名（默认 'label' 或 'name'）
  valueField?: string; // 值字段名（默认 'value' 或 'id'）
  labelTemplate?: string; // 标签模板，如 "{name} ({code}) - ¥{price}"
  extraFields?: string[]; // 需要在标签中显示的额外字段
}

// 基础字段配置
export interface BaseFieldConfig {
  key: string; // 字段唯一标识
  label: string; // 字段显示名称
  type: FieldType; // 字段类型
  placeholder?: string; // 占位符
  defaultValue?: any; // 默认值
  disabled?: boolean; // 是否禁用
  hidden?: boolean; // 是否隐藏
  tooltip?: string; // 提示信息
  rules?: ValidationRule[]; // 校验规则
  options?: FieldOption[]; // 选项（用于select、radio、checkbox等）- 兼容旧配置
  optionsConfig?: OptionsConfig; // 选项配置（新方式）
  optionsUrl?: string; // 动态选项数据源URL（兼容旧配置）
  dependsOn?: string[]; // 依赖字段
  valueFormatter?: (value: any) => any; // 值格式化函数
  dateFormat?: string; // 日期格式
}

// 表格列配置
export interface TableColumnConfig extends BaseFieldConfig {
  width?: number | string; // 列宽
  minWidth?: number; // 最小宽度
  maxWidth?: number; // 最大宽度
  fixed?: 'left' | 'right' | false; // 固定列
  align?: FieldAlign; // 对齐方式
  sortable?: boolean; // 是否可排序
  resizable?: boolean; // 是否可调整宽度
  ellipsis?: boolean; // 超出是否显示省略号
  render?: (value: any, record: any, index: number) => React.ReactNode; // 自定义渲染
  editable?: boolean; // 是否可编辑（行内编辑）
}

// 搜索表单字段配置
export interface SearchFieldConfig extends BaseFieldConfig {
  searchable: boolean; // 是否参与搜索
  searchType?: 'equal' | 'like' | 'range' | 'in'; // 搜索类型
  colSpan?: number; // 表单项占据的栅格数
  showInAdvanced?: boolean; // 是否在高级搜索中显示
  quickSearch?: boolean; // 是否快速搜索字段
}

// 新增/编辑表单字段配置
export interface FormFieldConfig extends BaseFieldConfig {
  editable: boolean; // 是否可编辑
  creatable: boolean; // 新增时是否显示
  updatable: boolean; // 编辑时是否显示
  colSpan?: number; // 表单项占据的栅格数
  group?: string; // 分组名称
  groupOrder?: number; // 分组顺序
  componentProps?: Record<string, any>; // 组件额外属性
}

// 完整字段配置（包含所有场景）
export interface FieldConfig {
  key: string;
  label: string;
  type: FieldType;
  
  // 表格配置
  table?: Omit<TableColumnConfig, 'key' | 'label' | 'type'>;
  
  // 搜索配置
  search?: Omit<SearchFieldConfig, 'key' | 'label' | 'type'>;
  
  // 表单配置
  form?: Omit<FormFieldConfig, 'key' | 'label' | 'type'>;
  
  // 通用配置
  common?: Omit<BaseFieldConfig, 'key' | 'label' | 'type'>;
}

// 表格配置
export interface TableConfig {
  name: string; // 表格名称
  description?: string; // 表格描述
  fields: FieldConfig[]; // 字段配置
  
  // 表格属性
  tableProps?: {
    bordered?: boolean;
    size?: 'large' | 'middle' | 'small';
    showHeader?: boolean;
    pagination?: boolean | {
      pageSize?: number;
      pageSizeOptions?: number[];
      showSizeChanger?: boolean;
      showQuickJumper?: boolean;
    };
    rowKey?: string;
    rowSelection?: boolean;
    expandable?: boolean;
    loading?: boolean;
  };
  
  // 操作配置
  actions?: {
    create?: boolean;
    update?: boolean;
    delete?: boolean;
    batchDelete?: boolean;
    export?: boolean;
    import?: boolean;
    custom?: Array<{
      key: string;
      label: string;
      icon?: React.ReactNode;
      type?: 'primary' | 'default' | 'link' | 'text' | 'dashed';
      permission?: string;
      onClick?: (record?: any, selectedRows?: any[]) => void;
    }>;
  };
  
  // API配置
  api?: {
    list?: string | ((params: any) => Promise<any>);
    create?: string | ((data: any) => Promise<any>);
    update?: string | ((id: any, data: any) => Promise<any>);
    delete?: string | ((id: any) => Promise<any>);
    batchDelete?: string | ((ids: any[]) => Promise<any>);
    export?: string | ((params: any) => Promise<any>);
    import?: string | ((file: File) => Promise<any>);
  };
  
  // 权限配置
  permissions?: {
    view?: string;
    create?: string;
    update?: string;
    delete?: string;
  };
}

// 搜索DTO
export interface SearchDTO {
  [key: string]: any;
  page?: number;
  pageSize?: number;
  sortBy?: string;
  sortOrder?: 'asc' | 'desc';
}

// 表单DTO
export interface FormDTO {
  [key: string]: any;
}

// 表格数据响应
export interface TableDataResponse<T = any> {
  list: T[];
  total: number;
  page: number;
  pageSize: number;
}

// 操作结果响应
export interface ActionResponse {
  success: boolean;
  message?: string;
  data?: any;
}
